
 <!DOCTYPE HTML>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  
    <title>正则表达式 | wustrive&#39;s blog</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=3, minimum-scale=1">
    
    <meta name="author" content="wustrive">
    
    <meta name="description" content="正则表达式，又称正规表示法、常规表示法（英语：Regular Expression，在代码中常简写为regex、regexp或RE），计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里，正则表达式通常被用来检索、替换那些符合某个模式的文本。">
    
    
    
    <meta name="twitter:card" content="summary" />
    <meta name="twitter:site" content="wustrive" />
    <meta name="twitter:title" content="正则表达式 | wustrive&#39;s blog" />
      
    
    
    <link rel="alternate" href="/atom.xml" title="wustrive&#39;s blog" type="application/atom+xml">
    
    
    <link rel="icon" href="/img/favicon.ico">
    
    
    <link rel="apple-touch-icon" href="/img/logo.ico">
    <link rel="apple-touch-icon-precomposed" href="/img/logo.ico">
    
    <link rel="stylesheet" href="/css/style.css">
    <script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "//hm.baidu.com/hm.js?5829c94e2ff91660826b6c0c188f5620";
      var s = document.getElementsByTagName("script")[0]; 
      s.parentNode.insertBefore(hm, s);
    })();
    </script>

</head>

  <body>
    <header>
      <div>
		
			<div id="imglogo">
				<a href="/"><img src="/img/logo.png" alt="wustrive&#39;s blog" title="wustrive&#39;s blog"/></a>
			</div>
			
			<div id="textlogo">
				<h1 class="site-name"><a href="/" title="wustrive&#39;s blog">wustrive&#39;s blog</a></h1>
				<h2 class="blog-motto">好记性不如写博客</h2>
			</div>
			<div class="navbar"><a class="navbutton navmobile" href="#" title="菜单">
			</a></div>
			<nav class="animated">
				<ul>
					
						<li><a href="/">主页</a></li>
					
						<li><a href="/archives">归档</a></li>
					
						<li><a href="/aboutme">关于</a></li>
					
					<li>
					
					<form class="search" action="//google.com/search" method="get" accept-charset="utf-8">
						<label>Search</label>
						<input type="text" id="search" name="q" autocomplete="off" maxlength="20" placeholder="搜索" />
						<input type="hidden" name="q" value="site:wustrive2008.github.io">
					</form>
					
					</li>
				</ul>
			</nav>			
</div>

    </header>
    <div id="container">
      <div id="main" class="post" itemscope itemprop="blogPost">
	<article itemprop="articleBody"> 
		<header class="article-info clearfix">
  <h1 itemprop="name">
    
      <a href="/2016/03/21/Linux/正则表达式/" title="正则表达式" itemprop="url">正则表达式</a>
  </h1>
  <p class="article-author">By
    
      <a href="https://wustrive2008.github.io" title="wustrive">wustrive</a>
    </p>
  <p class="article-time">
    <time datetime="2016-03-21T08:00:05.000Z" itemprop="datePublished">2016-03-21</time>
    更新日期:<time datetime="2016-11-05T18:14:33.000Z" itemprop="dateModified">2016-11-06</time>
    
  </p>
</header>
	<div class="article-content">
		
		
		<div id="toc" class="toc-article">
			<strong class="toc-title">文章目录</strong>
		<ol class="toc"><li class="toc-item toc-level-3"><a class="toc-link" href="#基础语法"><span class="toc-number">1.</span> <span class="toc-text">基础语法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#常用正则表达式"><span class="toc-number">2.</span> <span class="toc-text">常用正则表达式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#分组捕获_“()”"><span class="toc-number">3.</span> <span class="toc-text">分组捕获 “()”</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#分组"><span class="toc-number">3.1.</span> <span class="toc-text">分组</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#反向引用"><span class="toc-number">3.2.</span> <span class="toc-text">反向引用</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#自定义组名"><span class="toc-number">3.3.</span> <span class="toc-text">自定义组名</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#零宽断言"><span class="toc-number">4.</span> <span class="toc-text">零宽断言</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#零宽断言-1"><span class="toc-number">4.1.</span> <span class="toc-text">零宽断言</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#负向零宽断言"><span class="toc-number">4.2.</span> <span class="toc-text">负向零宽断言</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#贪婪与懒惰"><span class="toc-number">5.</span> <span class="toc-text">贪婪与懒惰</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#正则表达式编写建议"><span class="toc-number">6.</span> <span class="toc-text">正则表达式编写建议</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#常见问题"><span class="toc-number">6.1.</span> <span class="toc-text">常见问题</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#编写建议"><span class="toc-number">6.2.</span> <span class="toc-text">编写建议</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#参考博文"><span class="toc-number">7.</span> <span class="toc-text">参考博文</span></a></li></ol>
		</div>
		
		<p>正则表达式，又称正规表示法、常规表示法（英语：Regular Expression，在代码中常简写为regex、regexp或RE），计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里，正则表达式通常被用来检索、替换那些符合某个模式的文本。<br><a id="more"></a></p>
<h3 id="基础语法">基础语法</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div></pre></td><td class="code"><pre><div class="line">------------------------------------------------------------------------------</div><div class="line">字符         | 说明</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\            | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符</div><div class="line">------------------------------------------------------------------------------</div><div class="line">^            | 匹配输入字符串开始的位置</div><div class="line">------------------------------------------------------------------------------</div><div class="line">$            | 匹配输入字符串结束的位置</div><div class="line">------------------------------------------------------------------------------</div><div class="line">*            | 零次或多次匹配前面的字符或子表达式</div><div class="line">------------------------------------------------------------------------------</div><div class="line">+            | 一次或多次匹配前面的字符或子表达式</div><div class="line">------------------------------------------------------------------------------</div><div class="line">?            | 零次或一次匹配前面的字符或子表达式</div><div class="line">------------------------------------------------------------------------------</div><div class="line">&#123;n&#125;          | n 是非负整数。正好匹配 n 次</div><div class="line">------------------------------------------------------------------------------</div><div class="line">&#123;n,&#125;         | 至少匹配 n 次</div><div class="line">------------------------------------------------------------------------------</div><div class="line">&#123;n,m&#125;        | 匹配至少 n 次，至多 m 次</div><div class="line">------------------------------------------------------------------------------</div><div class="line">?            | 当此字符紧随任何其他限定符（*、+、?、&#123;n&#125;、&#123;n,&#125;、&#123;n,m&#125;）</div><div class="line">              之后时，匹配模式是&quot;非贪心的&quot;。&quot;非贪心的&quot;模式匹配搜索到的、</div><div class="line">              尽可能短的字符串，而默认的&quot;贪心的&quot;模式匹配搜索到的、尽可能长的字符串</div><div class="line">------------------------------------------------------------------------------</div><div class="line">.            | 匹配除&quot;\r\n&quot;之外的任何单个字符</div><div class="line">------------------------------------------------------------------------------</div><div class="line">(pattern)    | 匹配 pattern 并捕获该匹配的子表达式</div><div class="line">------------------------------------------------------------------------------</div><div class="line">(?:pattern)  | 匹配 pattern 但不捕获该匹配的子表达式，即它是一个非捕获匹配，</div><div class="line">              不存储供以后使用的匹配</div><div class="line">------------------------------------------------------------------------------</div><div class="line">(?=pattern)  | 执行正向预测先行搜索的子表达式，该表达式匹配处于匹配 </div><div class="line">              pattern 的字符串的起始点的字符串。它是一个非捕获匹配，即不能捕获供以后使用的匹配</div><div class="line">------------------------------------------------------------------------------</div><div class="line">(?!pattern)  | 执行反向预测先行搜索的子表达式，该表达式匹配不处于匹配 </div><div class="line">              pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配，即不能捕获供以后使用的匹配</div><div class="line">------------------------------------------------------------------------------</div><div class="line">x|y          | 匹配 x 或 y</div><div class="line">------------------------------------------------------------------------------</div><div class="line">[xyz]        | 字符集。匹配包含的任一字符</div><div class="line">------------------------------------------------------------------------------</div><div class="line">[^xyz]       | 反向字符集。匹配未包含的任何字符</div><div class="line">------------------------------------------------------------------------------</div><div class="line">[a-z]        | 字符范围。匹配指定范围内的任何字符</div><div class="line">------------------------------------------------------------------------------</div><div class="line">[^a-z]       | 反向范围字符。匹配不在指定的范围内的任何字符</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\b           | 匹配一个字边界，即字与空格间的位置。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\B           | 非字边界匹配。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\cx          | 匹配 x 指示的控制字符。例如，\cM 匹配 Control-M 或回车符。</div><div class="line">              x 的值必须在 A-Z 或 a-z 之间</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\d           | 数字字符匹配。等效于 [0-9]。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\D           | 非数字字符匹配。等效于 [^0-9]。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\f           | 换页符匹配。等效于 \x0c 和 \cL。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\n           | 换行符匹配。等效于 \x0a 和 \cJ。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\r           | 匹配一个回车符。等效于 \x0d 和 \cM。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\s           | 匹配任何空白字符，包括空格、制表符、换页符等。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\S           | 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\t           | 制表符匹配。与 \x09 和 \cI 等效。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\v           | 垂直制表符匹配。与 \x0b 和 \cK 等效。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\w           | 匹配任何字类字符，包括下划线。与&quot;[A-Za-z0-9_]&quot;等效</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\W           | 与任何非单词字符匹配。与&quot;[^A-Za-z0-9_]&quot;等效。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\xn          | 匹配 n，此处的 n 是一个十六进制转义码。</div><div class="line">              十六进制转义码必须正好是两位数长</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\num         | 匹配 num，此处的 num 是一个正整数。到捕获匹配的反向引用</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\n           | 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个</div><div class="line">              捕获子表达式，那么 n 是反向引用。否则，如果 n 是八进制数 (0-7)，那么 n 是八进制转义码。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\nm          | 标识一个八进制转义码或反向引用。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\nml         | 当 n 是八进制数 (0-3)，m 和 l 是八进制数 (0-7) 时，</div><div class="line">              匹配八进制转义码 nml。</div><div class="line">------------------------------------------------------------------------------</div><div class="line">\un          | 匹配 n，其中 n 是以四位十六进制数表示的 Unicode 字符。</div><div class="line">              例如，\u00A9 匹配版权符号 (©)。</div><div class="line">------------------------------------------------------------------------------</div></pre></td></tr></table></figure>
<h3 id="常用正则表达式">常用正则表达式</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div></pre></td><td class="code"><pre><div class="line">用户名：/^[a-z0-9_-]&#123;3,16&#125;$/</div><div class="line">密码：/^[a-z0-9_-]&#123;6,18&#125;$/</div><div class="line">十六进制值：/^#?([a-f0-9]&#123;6&#125;|[a-f0-9]&#123;3&#125;)$/</div><div class="line">电子邮箱：/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]&#123;2,6&#125;)$/</div><div class="line">URL：/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]&#123;2,6&#125;)([\/\w \.-]*)*\/?$/</div><div class="line">IP 地址：/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)&#123;3&#125;(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/</div><div class="line">HTML 标签：/^&lt;([a-z]+)([^&lt;]+)*(?:&gt;(.*)&lt;\/\1&gt;|\s+\/&gt;)$/</div><div class="line">Unicode编码中的汉字范围：/^[u4e00-u9fa5],&#123;0,&#125;$/</div><div class="line">匹配中文字符的正则表达式： [\u4e00-\u9fa5]</div><div class="line">评注：匹配中文还真是个头疼的事，有了这个表达式就好办了</div><div class="line">匹配双字节字符(包括汉字在内)：[^\x00-\xff]</div><div class="line">评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）</div><div class="line">匹配空白行的正则表达式：\n\s*\r</div><div class="line">评注：可以用来删除空白行</div><div class="line">匹配HTML标记的正则表达式：&lt;(\S*?)[^&gt;]*&gt;.*?&lt;/\1&gt;|&lt;.*? /&gt;</div><div class="line">评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力</div><div class="line">匹配首尾空白字符的正则表达式：^\s*|\s*$</div><div class="line">评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式</div><div class="line">匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</div><div class="line">评注：表单验证时很实用</div><div class="line">匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*</div><div class="line">评注：网上流传的版本功能很有限，上面这个基本可以满足需求</div><div class="line">匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]&#123;4,15&#125;$</div><div class="line">评注：表单验证时很实用</div><div class="line">匹配国内电话号码：\d&#123;3&#125;-\d&#123;8&#125;|\d&#123;4&#125;-\d&#123;7&#125;</div><div class="line">评注：匹配形式如 0511-4405222 或 021-87888822</div><div class="line">匹配腾讯QQ号：[1-9][0-9]&#123;4,&#125;</div><div class="line">评注：腾讯QQ号从10000开始</div><div class="line">匹配中国大陆邮政编码：[1-9]\d&#123;5&#125;(?!\d)</div><div class="line">评注：中国大陆邮政编码为6位数字</div><div class="line">匹配身份证：\d&#123;15&#125;|\d&#123;18&#125;</div><div class="line">评注：中国大陆的身份证为15位或18位</div><div class="line">匹配ip地址：\d+\.\d+\.\d+\.\d+</div><div class="line">评注：提取ip地址时有用</div><div class="line">匹配特定数字：</div><div class="line">^[1-9]\d*$　 　 //匹配正整数</div><div class="line">^-[1-9]\d*$ 　 //匹配负整数</div><div class="line">^-?[1-9]\d*$　　 //匹配整数</div><div class="line">^[1-9]\d*|0$　 //匹配非负整数（正整数 + 0）</div><div class="line">^-[1-9]\d*|0$　　 //匹配非正整数（负整数 + 0）</div><div class="line">^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$　　 //匹配正浮点数</div><div class="line">^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　 //匹配负浮点数</div><div class="line">^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　 //匹配浮点数</div><div class="line">^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$　　 //匹配非负浮点数（正浮点数 + 0）</div><div class="line">^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$　　//匹配非正浮点数（负浮点数 + 0）</div><div class="line">评注：处理大量数据时有用，具体应用时注意修正</div><div class="line">匹配特定字符串：</div><div class="line">^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串</div><div class="line">^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串</div><div class="line">^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串</div><div class="line">^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串</div><div class="line">^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串</div></pre></td></tr></table></figure>
<h3 id="分组捕获_“()”">分组捕获 “()”</h3><h4 id="分组">分组</h4><p>用小括号来指定子表达式(也叫做分组)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作。<br>默认情况下，每个分组会自动拥有一个组号，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。<br>示例：<br>(\d{1,3}.){3}\d{1,3}  是一个简单的IP地址匹配表达式。要理解这个表达式，请按下列顺序分析它：\d{1,3}匹配1到3位的数字，(\d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次，最后再加上一个一到三位的数字(\d{1,3})</p>
<h4 id="反向引用">反向引用</h4><p>后向引用用于重复搜索前面某个分组匹配的文本,示例:<br>\b(\w+)\b\s+\1\b可以用来匹配重复的单词，像go go, 或者kitty kitty。这个表达式首先是一个单词，也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b)，这个单词会被捕获到编号为1的分组中，然后是1个或几个空白符(\s+)，最后是分组1中捕获的内容（也就是前面匹配的那个单词）(\1)</p>
<h4 id="自定义组名">自定义组名</h4><p>你也可以自己指定子表达式的组名。要指定一个子表达式的组名，请使用这样的语法：(?<word>\w+)(或者把尖括号换成’也行：(?’Word’\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容，你可以使用\k<word>,所以上一个例子也可以写成这样：\b(?<word>\w+)\b\s+\k<word>\b。</word></word></word></word></p>
<p>常用的分组语法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">分类        代码/语法              说明</div><div class="line">-------------------------------------------------------------------------------</div><div class="line">捕获        (exp)                  匹配exp,并捕获文本到自动命名的组里</div><div class="line">-------------------------------------------------------------------------------</div><div class="line">            (?&lt;name&gt;exp)           匹配exp,并捕获文本到名称为name的组里，</div><div class="line">                                   也可以写成(?&apos;name&apos;exp)   </div><div class="line">-------------------------------------------------------------------------------</div><div class="line">            (?:exp)                匹配exp,不捕获匹配的文本，也不给此分组分配</div><div class="line">                                   组号</div><div class="line">-------------------------------------------------------------------------------</div><div class="line">零宽断言    (?=exp)                匹配exp前面的位置</div><div class="line">-------------------------------------------------------------------------------</div><div class="line">            (?&lt;=exp)               匹配exp后面的位置</div><div class="line">-------------------------------------------------------------------------------</div><div class="line">            (?!exp)                匹配后面跟的不是exp的位置</div><div class="line">-------------------------------------------------------------------------------</div><div class="line">            (?&lt;!exp)               匹配前面不是exp的位置</div></pre></td></tr></table></figure></p>
<h3 id="零宽断言">零宽断言</h3><h4 id="零宽断言-1">零宽断言</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">(?=exp)也叫零宽度正预测先行断言，它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b)，匹配以ing结尾的单词的前面部分(除了ing以外的部分)，如查找I&apos;m singing while you&apos;re dancing.时，它会匹配sing和danc。</div><div class="line">(?&lt;=exp)也叫零宽度正回顾后发断言，它断言自身出现的位置的前面能匹配表达式exp。比如(?&lt;=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分)，例如在查找reading a book时，它匹配ading。</div></pre></td></tr></table></figure>
<h4 id="负向零宽断言">负向零宽断言</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐，直接就观察出来了)，你会发现，如果q出现在单词的结尾的话，像Iraq,Benq，这个表达式就会出错。这是因为[^u]总要匹配一个字符，所以如果q是单词的最后一个字符的话，后面的[^u]将会匹配q后面的单词分隔符(可能是空格，或者是句号或其它的什么)，后面的\w*\b将会匹配下一个单词，于是\b\w*q[^u]\w*\b就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题，因为它只匹配一个位置，并不消费任何字符。现在，我们可以这样来解决这个问题：\b\w*q(?!u)\w*\b。</div><div class="line">零宽度负预测先行断言(?!exp)，断言此位置的后面不能匹配表达式exp。例如：\d&#123;3&#125;(?!\d)匹配三位数字，而且这三位数字的后面不能是数字；\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。</div><div class="line">同理，我们可以用</div><div class="line">(?&lt;!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp：(?&lt;![a-z])\d&#123;7&#125;匹配前面不是小写字母的七位数字</div></pre></td></tr></table></figure>
<h3 id="贪婪与懒惰">贪婪与懒惰</h3><p>当正则表达式中包含能接受重复的限定符时，通常的行为是（在使整个表达式能得到匹配的前提下）匹配尽可能多的字符。以这个表达式为例：a.<em>b，它将会匹配最长的以a开始，以b结束的字符串。如果用它来搜索aabab的话，它会匹配整个字符串aabab。这被称为贪婪匹配。<br>有时，我们更需要懒惰匹配，也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式，只要在它后面加上一个问号?。这样.</em>?就意味着匹配任意数量的重复，但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧：<br>a.*?b匹配最短的，以a开始，以b结束的字符串。如果把它应用于aabab的话，它会匹配aab（第一到第三个字符）和ab（第四到第五个字符）</p>
<h3 id="正则表达式编写建议">正则表达式编写建议</h3><h4 id="常见问题">常见问题</h4><p>误匹配：指正则表达式所匹配的内容范围超出了所需要范围，有些文本明明不符合要求，但是被所写的正则式“击中了”。例如，如果使用\d{11}来匹配11位的手机号，\d{11}不单能匹配正确的手机号，它还会匹配98765432100这样的明显不是手机号的字符串。我们把这样的匹配称之为误匹配。<br>漏匹配：指正则表达式所匹配的内容所规定的范围太狭窄，有些文本确实是所需要的，但是所写的正则没有将这种情况囊括在内。例如，使用\d{18}来匹配18位的身份证号码，就会漏掉结尾是字母X的情况。</p>
<p>写出一条正则表达式，既可能只出现误匹配（条件写得极宽松，其范围大于目标文本），也可能只出现漏匹配（只描述了目标文本中多种情况种的一种），还可能既有误匹配又有漏匹配。例如，使用\w+.com来匹配.com结尾的域名，既会误匹配abc_.com这样的字串（合法的域名中不含下划线，\w包含了下划线这种情况），又会漏掉ab-c.com这样的域名（合法域名中可以含中划线，但是\w不匹配中划线）。</p>
<h4 id="编写建议">编写建议</h4><ul>
<li><p>掌握语法细节。正则表达式在各种语言中，其语法大致相同，细节各有千秋。明确所使用语言的正则的语法的细节，是写出正确、高效正则表达式的基础。例如，perl中与\w等效的匹配范围是[a-zA-Z0-9_]；perl正则式不支持肯定逆序环视中使用可变的重复（variable repetition inside lookbehind，例如(?&lt;=.*)abc），但是.Net语法是支持这一特性的；又如，JavaScript连逆序环视（Lookbehind,如(?&lt;=ab)c）都不支持，而perl和python是支持的。《精通正则表达式》第3章《正则表达式的特性和流派概览》明确地列出了各大派系正则的异同，这篇文章也简要地列出了几种常用语言、工具中正则的比较。对于具体使用者而言，至少应该详细了解正在使用的那种工作语言里正则的语法细节。</p>
</li>
<li><p>先粗后精，先加后减。使用正则表达式语法对于目标文本进行描述和界定，可以像画素描一样，先大致勾勒出框架，再逐步在局步实现细节。仍举刚才的手机号的例子，先界定\d{11}，总不会错；再细化为1[358]\d{9}，就向前迈了一大步（至于第二位是不是3、5、8，这里无意深究，只举这样一个例子，说明逐步细化的过程）。这样做的目的是先消除漏匹配（刚开始先尽可能多地匹配，做加法），然后再一点一点地消除误匹配（做减法）。这样有先有后，在考虑时才不易出错，从而向“不误不漏”这个目标迈进。</p>
</li>
<li><p>留有余地。所能看到的文本sample是有限的，而待匹配检验的文本是海量的，暂时不可见的。对于这样的情况，在写正则表达式时要跳出所能见到的文本的圈子，开拓思路，作出“战略性前瞻”。例如，经常收到这样的垃圾短信：“发<em>票”、“发#漂”。如果要写规则屏蔽这样烦人的垃圾短信，不但要能写出可以匹配当前文本的正则表达式 发[</em>#](?:票|漂)，还要能够想到 发.(?:票|漂|飘)之类可能出现的“变种”。这在具体的领域或许会有针对性的规则，不多言。这样做的目的是消除漏匹配，延长正则表达式的生命周期。</p>
</li>
<li><p>明确。具体说来，就是谨慎用点号这样的元字符，尽可能不用星号和加号这样的任意量词。只要能确定范围的，例如\w，就不要用点号；只要能够预测重复次数的，就不要用任意量词。例如，写析取twitter消息的脚本，假设一条消息的xml正文部分结构是<span class="”msg”">…</span>且正文中无尖括号，那么<span class="”msg”">[^&lt;]{1,480}</span>这种写法的思路要好于<span class="”msg”">.*</span>，原因有二：一是使用[^&lt;]，它保证了文本的范围不会超出下一个小于号所在的位置；二是明确长度范围，{1,480}，其依据是一条twitter消息大致能的字符长度范围。当然，480这个长度是否正确还可推敲，但是这种思路是值得借鉴的。说得狠一点，“滥用点号、星号和加号是不环保、不负责任的做法”。</p>
</li>
<li><p>不要让稻草压死骆驼。每使用一个普通括号()而不是非捕获型括号(?:…)，就会保留一部分内存等着你再次访问。这样的正则表达式、无限次地运行次数，无异于一根根稻草的堆加，终于能将骆驼压死。养成合理使用(?:…)括号的习惯。</p>
</li>
<li><p>宁简勿繁。将一条复杂的正则表达式拆分为两条或多条简单的正则表达式，编程难度会降低，运行效率会提升。例如用来消除行首和行尾空白字符的正则表达式s/^\s+|\s+$//g;，其运行效率理论上要低于s/^\s+//g; s/\s+$//g; 。这个例子出自《精通正则表达式》第五章，书中对它的评论是“它几乎总是最快的，而且显然最容易理解”。既快又容易理解，何乐而不为？工作中我们还有其它的理由要将C==(A|B)这样的正则表达式拆为A和B两条表达式分别执行。例如，虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配，但是如果只要有一条子表达式（例如A）会产生误匹配，那么不论其它的子表达式（例如B）效率如何之高，范围如何精准，C的总体精准度也会因A而受到影响。</p>
</li>
<li><p>巧妙定位。有时候，我们需要匹配的the，是作为单词的the（两边有空格），而不是作为单词一部分的t-h-e的有序排列（例如together中的the）。在适当的时候用上^，$，\b等等定位锚点，能有效提升找到成功匹配、淘汰不成功匹配的效率。</p>
</li>
</ul>
<h3 id="参考博文">参考博文</h3><ol>
<li><a href="http://www.jb51.net/tools/zhengze.html" target="_blank" rel="external">正则表达式30分钟入门教程</a></li>
<li><a href="http://www.jb51.net/tools/regex.htm" target="_blank" rel="external">常用正则表达式</a></li>
</ol>
  
	</div>
		<footer class="article-footer clearfix">

  <div class="article-tags">
  
  <span></span> <a href="/tags/linux/">linux</a><a href="/tags/regex/">regex</a><a href="/tags/正则表达式/">正则表达式</a>
  </div>


<div class="article-categories">
  <span></span>
  <a class="article-category-link" href="/categories/Linux/">Linux</a>
</div>



<div class="article-share" id="share">

  <div data-url="https://wustrive2008.github.io/2016/03/21/Linux/正则表达式/" data-title="正则表达式 | wustrive&#39;s blog" data-tsina="null" class="share clearfix">
  </div>

</div>
</footer>   	       
	</article>
	
<nav class="article-nav clearfix">
 
 <div class="prev" >
 <a href="/2016/08/27/工作与分享/2016.8.27分享内容/" title="2016.8.27分享内容">
  <strong>PREVIOUS:</strong><br/>
  <span>
  2016.8.27分享内容</span>
</a>
</div>


<div class="next">
<a href="/2016/01/14/js/arrayFunction/"  title="javaScript数组方法总结">
 <strong>NEXT:</strong><br/> 
 <span>javaScript数组方法总结
</span>
</a>
</div>

</nav>

	
<section class="comment">
	<div class="ds-thread"></div>
</section>

</div>  
      <div class="openaside"><a class="navbutton" href="#" title="显示侧边栏"></a></div>

  <div id="toc" class="toc-aside">
  <strong class="toc-title">文章目录</strong>
  <ol class="toc"><li class="toc-item toc-level-3"><a class="toc-link" href="#基础语法"><span class="toc-number">1.</span> <span class="toc-text">基础语法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#常用正则表达式"><span class="toc-number">2.</span> <span class="toc-text">常用正则表达式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#分组捕获_“()”"><span class="toc-number">3.</span> <span class="toc-text">分组捕获 “()”</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#分组"><span class="toc-number">3.1.</span> <span class="toc-text">分组</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#反向引用"><span class="toc-number">3.2.</span> <span class="toc-text">反向引用</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#自定义组名"><span class="toc-number">3.3.</span> <span class="toc-text">自定义组名</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#零宽断言"><span class="toc-number">4.</span> <span class="toc-text">零宽断言</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#零宽断言-1"><span class="toc-number">4.1.</span> <span class="toc-text">零宽断言</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#负向零宽断言"><span class="toc-number">4.2.</span> <span class="toc-text">负向零宽断言</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#贪婪与懒惰"><span class="toc-number">5.</span> <span class="toc-text">贪婪与懒惰</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#正则表达式编写建议"><span class="toc-number">6.</span> <span class="toc-text">正则表达式编写建议</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#常见问题"><span class="toc-number">6.1.</span> <span class="toc-text">常见问题</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#编写建议"><span class="toc-number">6.2.</span> <span class="toc-text">编写建议</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#参考博文"><span class="toc-number">7.</span> <span class="toc-text">参考博文</span></a></li></ol>
  </div>

<div id="asidepart">
<div class="closeaside"><a class="closebutton" href="#" title="隐藏侧边栏"></a></div>
<aside class="clearfix">

  
<div class="categorieslist">
	<p class="asidetitle">分类</p>
		<ul>
		
			<li><a href="/categories/DB/" title="DB">DB<sup>1</sup></a></li>
		
			<li><a href="/categories/Linux/" title="Linux">Linux<sup>6</sup></a></li>
		
			<li><a href="/categories/UML/" title="UML">UML<sup>1</sup></a></li>
		
			<li><a href="/categories/cORc/" title="cORc++">cORc++<sup>1</sup></a></li>
		
			<li><a href="/categories/hexo/" title="hexo">hexo<sup>1</sup></a></li>
		
			<li><a href="/categories/http协议/" title="http协议">http协议<sup>2</sup></a></li>
		
			<li><a href="/categories/java/" title="java">java<sup>10</sup></a></li>
		
			<li><a href="/categories/js/" title="js">js<sup>1</sup></a></li>
		
			<li><a href="/categories/nginx/" title="nginx">nginx<sup>1</sup></a></li>
		
			<li><a href="/categories/python/" title="python">python<sup>2</sup></a></li>
		
			<li><a href="/categories/分享/" title="分享">分享<sup>1</sup></a></li>
		
			<li><a href="/categories/摘录/" title="摘录">摘录<sup>1</sup></a></li>
		
			<li><a href="/categories/版本控制/" title="版本控制">版本控制<sup>3</sup></a></li>
		
			<li><a href="/categories/算法/" title="算法">算法<sup>2</sup></a></li>
		
			<li><a href="/categories/缓存/" title="缓存">缓存<sup>1</sup></a></li>
		
			<li><a href="/categories/网络协议/" title="网络协议">网络协议<sup>1</sup></a></li>
		
			<li><a href="/categories/网络安全/" title="网络安全">网络安全<sup>1</sup></a></li>
		
			<li><a href="/categories/设计模式/" title="设计模式">设计模式<sup>2</sup></a></li>
		
			<li><a href="/categories/读书笔记/" title="读书笔记">读书笔记<sup>10</sup></a></li>
		
		</ul>
</div>


  
<div class="tagslist">
	<p class="asidetitle">标签</p>
		<ul class="clearfix">
		
			<li><a href="/tags/Arraylist/" title="Arraylist">Arraylist<sup>1</sup></a></li>
		
			<li><a href="/tags/Centos/" title="Centos">Centos<sup>2</sup></a></li>
		
			<li><a href="/tags/DB/" title="DB">DB<sup>1</sup></a></li>
		
			<li><a href="/tags/Docker/" title="Docker">Docker<sup>1</sup></a></li>
		
			<li><a href="/tags/Email/" title="Email">Email<sup>1</sup></a></li>
		
			<li><a href="/tags/HashMap/" title="HashMap">HashMap<sup>1</sup></a></li>
		
			<li><a href="/tags/HotSpot/" title="HotSpot">HotSpot<sup>1</sup></a></li>
		
			<li><a href="/tags/IMAP/" title="IMAP">IMAP<sup>1</sup></a></li>
		
			<li><a href="/tags/Java/" title="Java">Java<sup>1</sup></a></li>
		
			<li><a href="/tags/Linux/" title="Linux">Linux<sup>5</sup></a></li>
		
			<li><a href="/tags/OOM/" title="OOM">OOM<sup>1</sup></a></li>
		
			<li><a href="/tags/POP3/" title="POP3">POP3<sup>1</sup></a></li>
		
			<li><a href="/tags/SMTP/" title="SMTP">SMTP<sup>1</sup></a></li>
		
			<li><a href="/tags/Tomcat/" title="Tomcat">Tomcat<sup>1</sup></a></li>
		
			<li><a href="/tags/UML/" title="UML">UML<sup>1</sup></a></li>
		
			<li><a href="/tags/aes/" title="aes">aes<sup>1</sup></a></li>
		
			<li><a href="/tags/array/" title="array">array<sup>1</sup></a></li>
		
			<li><a href="/tags/arraylist/" title="arraylist">arraylist<sup>1</sup></a></li>
		
			<li><a href="/tags/c/" title="c">c<sup>2</sup></a></li>
		
			<li><a href="/tags/chkconfig/" title="chkconfig">chkconfig<sup>1</sup></a></li>
		
		</ul>
</div>


  <div class="rsspart">
	<a href="/atom.xml" target="_blank" title="rss">RSS 订阅</a>
</div>

</aside>
</div>
    </div>
    <footer><div id="footer" >
	
	<div class="line">
		<span></span>
		<div class="author"></div>
	</div>
	
	
	<section class="info">
		<p> Hello, I&#39;m wustrive. This is my blog on GitHub. <br/>
			I wish you happiness</p>
	</section>
	 
	<div class="social-font clearfix">
		
		<a href="http://weibo.com/12100106" target="_blank" title="weibo"></a>
		
		
		<a href="https://twitter.com/wustrive" target="_blank" title="twitter"></a>
		
		
		<a href="https://github.com/wustrive2008" target="_blank" title="github"></a>
		
		
		
	</div>
		<p class="copyright">Powered by <a href="http://hexo.io" target="_blank" title="hexo">hexo</a> and Theme by <a href="https://github.com/A-limon/pacman" target="_blank" title="Pacman">Pacman</a> © 2018 
		
		<a href="https://wustrive2008.github.io" target="_blank" title="wustrive">wustrive</a>
		
		</p>
</div>
</footer>
    <script src="/js/jquery-2.1.0.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){ 
  $('.navbar').click(function(){
    $('header nav').toggleClass('shownav');
  });
  var myWidth = 0;
  function getSize(){
    if( typeof( window.innerWidth ) == 'number' ) {
      myWidth = window.innerWidth;
    } else if( document.documentElement && document.documentElement.clientWidth) {
      myWidth = document.documentElement.clientWidth;
    };
  };
  var m = $('#main'),
      a = $('#asidepart'),
      c = $('.closeaside'),
      o = $('.openaside');
  $(window).resize(function(){
    getSize(); 
    if (myWidth >= 1024) {
      $('header nav').removeClass('shownav');
    }else
    {
      m.removeClass('moveMain');
      a.css('display', 'block').removeClass('fadeOut');
      o.css('display', 'none');
      
      $('#toc.toc-aside').css('display', 'none');
        
    }
  });
  c.click(function(){
    a.addClass('fadeOut').css('display', 'none');
    o.css('display', 'block').addClass('fadeIn');
    m.addClass('moveMain');
  });
  o.click(function(){
    o.css('display', 'none').removeClass('beforeFadeIn');
    a.css('display', 'block').removeClass('fadeOut').addClass('fadeIn');      
    m.removeClass('moveMain');
  });
  $(window).scroll(function(){
    o.css("top",Math.max(80,260-$(this).scrollTop()));
  });
});
</script>

<script type="text/javascript">
$(document).ready(function(){ 
  var ai = $('.article-content>iframe'),
      ae = $('.article-content>embed'),
      t  = $('#toc'),
      h  = $('article h2')
      ah = $('article h2'),
      ta = $('#toc.toc-aside'),
      o  = $('.openaside'),
      c  = $('.closeaside');
  if(ai.length>0){
    ai.wrap('<div class="video-container" />');
  };
  if(ae.length>0){
   ae.wrap('<div class="video-container" />');
  };
  if(ah.length==0){
    t.css('display','none');
  }else{
    c.click(function(){
      ta.css('display', 'block').addClass('fadeIn');
    });
    o.click(function(){
      ta.css('display', 'none');
    });
    $(window).scroll(function(){
      ta.css("top",Math.max(140,320-$(this).scrollTop()));
    });
  };
});
</script>


<script type="text/javascript">
$(document).ready(function(){ 
  var $this = $('.share'),
      url = $this.attr('data-url'),
      encodedUrl = encodeURIComponent(url),
      title = $this.attr('data-title'),
      tsina = $this.attr('data-tsina');
  var html = [
  '<a href="#" class="overlay" id="qrcode"></a>',
  '<div class="qrcode clearfix"><span>扫描二维码分享到微信朋友圈</span><a class="qrclose" href="#share"></a><strong>Loading...Please wait</strong><img id="qrcode-pic" data-src="http://s.jiathis.com/qrcode.php?url=' + encodedUrl + '"/></div>',
  '<a href="#textlogo" class="article-back-to-top" title="Top"></a>',
  '<a href="https://www.facebook.com/sharer.php?u=' + encodedUrl + '" class="article-share-facebook" target="_blank" title="Facebook"></a>',
  '<a href="#qrcode" class="article-share-qrcode" title="QRcode"></a>',
  '<a href="https://twitter.com/intent/tweet?url=' + encodedUrl + '" class="article-share-twitter" target="_blank" title="Twitter"></a>',
  '<a href="http://service.weibo.com/share/share.php?title='+title+'&url='+encodedUrl +'&ralateUid='+ tsina +'&searchPic=true&style=number' +'" class="article-share-weibo" target="_blank" title="Weibo"></a>',
  '<span title="Share to"></span>'
  ].join('');
  $this.append(html);
  $('.article-share-qrcode').click(function(){
    var imgSrc = $('#qrcode-pic').attr('data-src');
    $('#qrcode-pic').attr('src', imgSrc);
    $('#qrcode-pic').load(function(){
        $('.qrcode strong').text(' ');
    });
  });
});     
</script>


<script type="text/javascript">
  var duoshuoQuery = {short_name:"wustrive"};
  (function() {
    var ds = document.createElement('script');
    ds.type = 'text/javascript';ds.async = true;
    ds.src = '//static.duoshuo.com/embed.js';
    ds.charset = 'UTF-8';
    (document.getElementsByTagName('head')[0] 
    || document.getElementsByTagName('body')[0]).appendChild(ds);
  })();
</script> 




<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-22190106-2', 'auto');  
ga('send', 'pageview');
</script>


<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-22190106-2', 'auto');
  ga('send', 'pageview');

</script>

  </body>
</html>
